﻿
namespace LM.TesteUnitario
{
    using LM.InterfacesFabricas.Basicos.Enumeradores;
    using LM.InterfacesFabricas.DTOs;
    using LM.InterfacesFabricas.Excecoes;
    using LM.InterfacesFabricas.Fabricas;
    using LM.InterfacesFabricas.Interfaces.Servicos;
    using NUnit.Framework;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;

    [TestFixture]
    class TestesServicoDeCliente
    {
        private IServicoDeCliente _servicoDeCliente;

        [SetUp]
        public void SetUp()
        {
            _servicoDeCliente = FabricaGenerica.Crie<IServicoDeCliente>();
        }

        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            LimpeDados();
        }

        [Test]
        public void TesteCadastreComSucesso()
        {
            LimpeDados();
            var dtoCliente = new DtoCliente
            {
                Codigo = 999,
                Nome = "João da Silva",
                Cpf = 11122233344,
                Cnh = 12345678,
                TipoDoCliente = EnumTipoDoCliente.Mensalista,
                Telefones = new List<DtoTelefone> 
                {
                    new DtoTelefone(){
                        Codigo = 1,
                        Ddd = 62,
                        Numero = "35459000",
                        TipoDeTelefone = EnumTipoDeTelefone.Celular
                    },
                    new DtoTelefone(){
                        Codigo = 2,
                        Ddd = 62,
                        Numero = "35459500",
                        TipoDeTelefone = EnumTipoDeTelefone.Celular
                    },
                },
                Endereco = new List<DtoEndereco> 
                {
                    new DtoEndereco()
                    {
                        Codigo = 1,
                        Cidade =  "Goiania",
                        Complemento = "Cidade Empresarial",
                        Lote = "05",
                        Quadra = "01",
                        Cep = 45444444,
                        Logradouro = "Teste",
                        Bairro = "!@#$%¨&*(",
                        Uf = EnumUnidadeFederativa.GO
                    }
                }

            };

            _servicoDeCliente.Cadastre(dtoCliente);
        }

        [Test]
        [ExpectedException(typeof(InconsistenciasException))]
        public void TesteCadastreComInconsistencia()
        {
            var dtoCliente = new DtoCliente { Codigo = 1, Nome = "" };

            _servicoDeCliente.Cadastre(dtoCliente);
        }

        [Test]
        public void TesteAtualizeComSucesso()
        {
            LimpeDados();
            InicializeDados();
            const string novoNome = "João da Silva Souza";

            var cliente = _servicoDeCliente.Consulte(999);
            cliente.Nome = novoNome;
            _servicoDeCliente.Atualize(cliente);

            cliente = _servicoDeCliente.Consulte(999);
            Assert.AreEqual(novoNome, cliente.Nome);
        }

        [Test]
        public void TesteExcluaComSucesso()
        {
            LimpeDados();
            InicializeDados();

            var cliente = _servicoDeCliente.Consulte(999);
            Assert.IsNotNull(cliente);
            Assert.AreEqual(999, cliente.Codigo);

            _servicoDeCliente.Exclua(999);
            cliente = _servicoDeCliente.Consulte(999);

            Assert.IsNull(cliente);
        }

        [Test]
        public void TesteConsulteTodosComSucesso()
        {
            LimpeDados();
            InicializeDados();

            Assert.Greater(FabricaGenerica.Crie<IServicoDeCliente>().ConsulteTodos().Count, 0);
        }

        private void InicializeDados()
        {
            FabricaGenerica.Crie<IServicoDeCliente>().Cadastre(new DtoCliente
                                                                 {
                                                                     Codigo = 999,
                                                                     Nome = "João da Silva",
                                                                     Cpf = 111111111111,
                                                                     Cnh = 222222,
                                                                     TipoDoCliente = EnumTipoDoCliente.Mensalista
                                                                 });

        }

        private void LimpeDados()
        {
            var cliente = FabricaGenerica.Crie<IServicoDeCliente>().Consulte(999);

            if (cliente != null)
            {
                _servicoDeCliente.Exclua(cliente.Codigo);
            }
        }
    }
}
